﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Init
{
    static class GetClass
    {
        const string DEFAULTNAME = "NameNotFound";
        const string DEFAULTLEVEL = "private";
        const bool DEFAULTSTATIC = false;

        //メンバ変数の取得
        public static void GetClassMember(ref string Code, ref List<Class> CodeClass)
        {
            Regex mm = new Regex(@"##(?<name>[A-Za-z_ :]+)## \[ (?<main>[\D]+) \] ;");//クラス用正規表現

            CodeClass.Add(new Class());//Noneクラスを追加する
            CodeClass[0].Name = "None";//名前の設定

            while (mm.Match(Code).Success == true)//見つかる間
            {
                CodeClass.Add(new Class());

                Match m = mm.Match(Code);//マッチした情報を取得
                string name = m.Groups["name"].Value.Replace("##", "");//情報を取得
                string[] names = name.Split(':');//切り分け

                if (names[0].Replace(" ", "") == "None")//もしもNoneが名前に使われていたら
                {
                    throw new ClassNameException("クラス名にNoneは使えません。");//識別子なので蹴る
                }

                if (names.Length < 2)//ひとつしかない場合
                {
                    CodeClass[CodeClass.Count - 1].Name = name.Replace(" ", ""); ;//名前を登録
                    CodeClass[CodeClass.Count - 1].StaticSign = DEFAULTSTATIC;//デフォルト状態に
                }
                else
                {
                    name = names[0];
                    CodeClass[CodeClass.Count - 1].Name = name.Replace(" ","");//名前を登録
                    CodeClass[CodeClass.Count - 1].StaticSign = (names[1].Replace(" ", "") == "static");
                }

                #region debug
#if DEBUG
                Console.WriteLine("[Class::Memb]Name = [{0}] Static = [{1}]", CodeClass[CodeClass.Count - 1].Name, CodeClass[CodeClass.Count - 1].StaticSign.ToString());
#endif
                #endregion


                string Main = m.Groups["main"].Value;//内容を取得

                string[] Split = Main.Split(';');//文で分ける


                foreach (string temp in Split)//文毎に処理
                {
                    if (temp == "") continue;
                    string[] var = temp.Split(':');//切り分け
                    Variable v = new Variable();//追加用変数
                    v.Name = var[0].Replace(" ", "");//名前
                    if (var.Length >= 2)//指定子が省略されていなければ
                    {
                        v.AccessLevel = var[1].Replace(" ", "");//アクセスレベル

                        #region debug
#if DEBUG
                        Console.WriteLine("[GetClass::AccessLevel]{0}",var[1].Replace(" ",""));
#endif
                        #endregion
                    }
                    if (v.Name == "")//名前が空なら
                    {
                        v.Name = DEFAULTNAME;//デフォルト設定を適用
                    }
                    if (v.AccessLevel != "private" && v.AccessLevel != "public")//アクセス指定子でなければ
                    {
                        v.AccessLevel = DEFAULTLEVEL;//デフォルトで設定
                    }

                    CodeClass[CodeClass.Count - 1].Variables.Add(v);//追加
                    #region debug
#if DEBUG
                    int index = CodeClass.Count-1;
                    Console.WriteLine("[Class::Memb::Variable]Name = [{0}] AccessLevel = [{1}]",CodeClass[index].Variables[CodeClass[index].Variables.Count-1].Name,CodeClass[index].Variables[CodeClass[index].Variables.Count-1].AccessLevel);
#endif
                    #endregion

                }


                Code = Code.Remove(m.Index, m.Length);//読み取った部分を削除

            }

        }


    }
}
